/** @brief Fichier définissant des convertisseurs XML vers objets.
 *
 * Ce fichier contient la déclaration de fonctions utiles pour construires
 * différents objets depuis le contenu d'un fichier XML.
 *
 * @file InterpreteXML.hpp
 * @author Johan "Solo" Luisier
 * @date 2010
 *
 * @todo Beaucoup de ces fonctions serait bien mieux comme membres statiques de
 * la classe concernée.
 */
#ifndef INTERPRETEXML_H
#define INTERPRETEXML_H

#include "Noyau/Couleur.hpp"

#include "Algebre/Coord.hpp"
#include "Algebre/Vecteur.hpp"

#include <vector>

class ElementDOM;

class Environnement;
class Camera;
class Lumiere;
class Objet;
class Forme;
class Materiau;

/** @brief Fonction permettant de récupérer les données d'une balise si le nom
 * correspond.
 *
 * La fonction permet d'accéder au champ de donnée d'une balise, sous la
 * condition que la balise est bien la balise attendue.
 *
 * @param[in] elIt itérateur sur l'instance à tester.
 * @param[in] attendue balise attendue.
 * @param[out] donnees contenu de la balise, pour autant qu'elle corresponde à
 * @e attendue.
 *
 * @retval true si la balise correspond bien à @c attendue, @retval false sinon.
 */
bool lireContenuEtDonnees( std::vector< const ElementDOM* >::const_iterator& elIt,
                           const std::string& attendue, std::string& donnees );

/** @brief Fonction permettant de récupérer une instance de Couleur.
 *
 * Cette fonction permet de récupérer une instance de Couleur depuis le contenu
 * d'une balise décrivant une couleur.
 *
 * @param[in] donnees contenu de la balise à convertir en couleur.
 * @param[out] etat contient @c true si la conversion s'est bien passée, @e
 * false si une erreur s'est produite.
 *
 * @return une instance de Couleur construite à partir du contenu de @c donnees.
 */
Couleur lireCouleur( const std::string& donnees, bool& etat );

/** @brief Fonction permettant de récupérer une instance de Coord.
 *
 * Cette fonction permet de récupérer une instance de Coord depuis le contenu
 * d'une balise décrivant un point.
 *
 * @param[in] donnees contenu de la balise à convertir en point.
 * @param[out] etat contient @c true si la conversion s'est bien passée, @e
 * false si une erreur s'est produite.
 *
 * @return une instance de Coord construite à partir du contenu de @c donnees.
 */
Coord lireCoord( const std::string& donnees, bool& etat );

/** @brief Fonction permettant de récupérer une instance de Vecteur.
 *
 * Cette fonction permet de récupérer une instance de Vecteur depuis le contenu
 * d'une balise décrivant un vecteur.
 *
 * @param[in] donnees contenu de la balise à convertir en vecteur.
 * @param[out] etat contient @c true si la conversion s'est bien passée, @e
 * false si une erreur s'est produite.
 *
 * @return une instance de Vecteur construite à partir du contenu de @c
 * donnees.
 */
Vecteur lireVecteur( const std::string& donnees, bool& etat );

Environnement* lireEnvironnement( const std::vector< const ElementDOM* > &infos,
                                  bool& etat );

Camera* lireCamera( const std::vector< const ElementDOM* > &infos, bool& etat );

Lumiere* lireLampe( std::vector< const ElementDOM* >::const_iterator &elIt,
                    bool& etat );

Objet* lireObjet( std::vector< const ElementDOM* >::const_iterator &elIt,
                  bool& etat );

Forme* lireForme( std::vector< const ElementDOM* >::const_iterator &elIt,
                  bool& etat );

Materiau* lireMateriau( std::vector< const ElementDOM* >::const_iterator &elIt,
                        bool& etat );


#endif // INTERPRETEXML_H
